前幾天都是在解析UE裡面控制每個不論是變數、物件或是函式如何與網路連線互動,接著要探討如何去維護與管理讓網路連線的品質提升。
在之前有提過在變數或物件上都有Replicates的選項可以決定是否要進行資料同步,更深入還有Relevancy-關聯性、Update frequency-更新頻率、Priority-優先度可以去做細部的調整。
這簡而言之是決定一個物件與其他客戶端的相關性,舉個簡單的例子就是玩家狀態(PlayerState)與遊戲控制(PlayerController),玩家狀態基本上會同步給所有的客戶端因此玩家狀態會設定成永遠相關讓所有的客戶端都能夠複製一份資料到本地,而遊戲控制是每個客戶端自己的資料,其他的客戶端沒有必要去了解或是與其他客戶端的控制器去溝通,這也是UE裡面最基本的設定,凡是控制器之間的訊息要溝通一定會在伺服器進行資訊交換,絕對不會複製一份控制器的資訊到其他客戶端。
這裡有幾個基本的設定可以利用BP或是C++去實現,這邊就先以BP做示範會相較容易一些。
在Replication的下面會有這兩個選項可以做開關,顯而易見一個只將相關性限制在擁有者上面,另一個就是永遠都有相關性,讀者可以把腳色裡的Only Relevant to Owner打勾實際執行看看會發現伺服端因為知道所有訊息所以不受影響,但是客戶端卻看不見伺服端的角色,因為伺服端的角色與本地端不相關。
接下來是Net Use Owner Relevancy,簡而言之他的相關性會跟著擁有著走,例如今天一個法師擁有火球術的技能,他能夠丟出一個火球物件所以這個火球與法師是有相關性的,而旁邊的劍士若與法師也沒有設定相關性,那劍士不但看不見法師也看不見火球,但是只要與法師建立相關性火球也能自然而然地與劍士建立相關性。
然後除了不是關就是永久開啟的相關性設定,最常見的就是的Net cull distance squared,他會根據距離去綁定相關性,這邊讀者可以把原本的設定調成2250000來實際測試看看,在客戶端只要離伺服端的角色太遠過一段時間就會消失,只要一接近就會又立刻出現並且執行Being play印出腳色的血量。
距離太遠消失了
一接近又出現了
這最多的應用莫過於大型多人連線遊戲,試想一下離我好遠的物件或是玩家有必要去更新那麼多的資訊嗎?這在資訊傳遞上可以省下很多頻寬讓遊戲執行更流暢。